﻿2026-05-13T07:13:14.0870746Z ##[group]Run pnpm verify:phase-4
2026-05-13T07:13:14.0871048Z [36;1mpnpm verify:phase-4[0m
2026-05-13T07:13:14.0883958Z shell: /usr/bin/bash -e {0}
2026-05-13T07:13:14.0884366Z env:
2026-05-13T07:13:14.0884614Z   PNPM_HOME: /home/runner/setup-pnpm/node_modules/.bin
2026-05-13T07:13:14.0884911Z   SKIP_PHASE_3_CARRYOVER: 1
2026-05-13T07:13:14.0885133Z   SKIP_TRACE_CHECK: 1
2026-05-13T07:13:14.0885336Z ##[endgroup]
2026-05-13T07:13:14.3608061Z 
2026-05-13T07:13:14.3609107Z > rebno@0.0.0 verify:phase-4 /home/runner/work/rebno/rebno
2026-05-13T07:13:14.3610205Z > node scripts/verify-phase-4.mjs
2026-05-13T07:13:14.3610679Z 
2026-05-13T07:13:14.3943167Z 
2026-05-13T07:13:14.3965146Z === Workspace: typecheck ===
2026-05-13T07:13:14.3973637Z >>> pnpm -r typecheck
2026-05-13T07:13:14.7002234Z Scope: 5 of 6 workspace projects
2026-05-13T07:13:14.7051562Z packages/db typecheck$ tsc --noEmit
2026-05-13T07:13:14.7059954Z packages/game-logic typecheck$ tsc --noEmit
2026-05-13T07:13:17.1413879Z packages/game-logic typecheck: Done
2026-05-13T07:13:17.1431860Z packages/protocol typecheck$ tsc --noEmit
2026-05-13T07:13:19.2415444Z packages/db typecheck: Done
2026-05-13T07:13:20.4943617Z packages/protocol typecheck: Done
2026-05-13T07:13:20.4950170Z apps/client typecheck$ tsc --noEmit
2026-05-13T07:13:20.4953030Z apps/server typecheck$ tsc --noEmit
2026-05-13T07:13:30.9526759Z apps/client typecheck: Done
2026-05-13T07:13:32.3678126Z apps/server typecheck: Done
2026-05-13T07:13:32.3753605Z 
2026-05-13T07:13:32.3754502Z === Lint: protocol-sync ===
2026-05-13T07:13:32.3755349Z >>> pnpm lint:protocol-sync
2026-05-13T07:13:32.6662051Z 
2026-05-13T07:13:32.6684780Z > rebno@0.0.0 lint:protocol-sync /home/runner/work/rebno/rebno
2026-05-13T07:13:32.6690017Z > node tools/scripts/lint-protocol-sync.mjs
2026-05-13T07:13:32.6690603Z 
2026-05-13T07:13:32.6948259Z lint-protocol-sync: OK
2026-05-13T07:13:32.7043182Z 
2026-05-13T07:13:32.7043989Z === Lint: game-logic-purity ===
2026-05-13T07:13:32.7046800Z >>> pnpm lint:game-logic-purity
2026-05-13T07:13:32.9851485Z 
2026-05-13T07:13:32.9855673Z > rebno@0.0.0 lint:game-logic-purity /home/runner/work/rebno/rebno
2026-05-13T07:13:32.9857005Z > node tools/scripts/lint-game-logic-purity.mjs
2026-05-13T07:13:32.9857595Z 
2026-05-13T07:13:33.0168337Z lint-game-logic-purity: OK (7 file(s) clean)
2026-05-13T07:13:33.0254680Z 
2026-05-13T07:13:33.0255522Z === Lint: better-auth-schema-sync ===
2026-05-13T07:13:33.0261691Z >>> pnpm lint:better-auth-schema-sync
2026-05-13T07:13:33.3053686Z 
2026-05-13T07:13:33.3065431Z > rebno@0.0.0 lint:better-auth-schema-sync /home/runner/work/rebno/rebno
2026-05-13T07:13:33.3066597Z > node tools/scripts/lint-better-auth-schema-sync.mjs
2026-05-13T07:13:33.3068195Z 
2026-05-13T07:13:34.8050288Z lint-better-auth-schema-sync: OK
2026-05-13T07:13:34.8145376Z 
2026-05-13T07:13:34.8155213Z === Lint: rate-limit-budgets ===
2026-05-13T07:13:34.8156076Z >>> pnpm lint:rate-limit-budgets
2026-05-13T07:13:35.0940261Z 
2026-05-13T07:13:35.0941391Z > rebno@0.0.0 lint:rate-limit-budgets /home/runner/work/rebno/rebno
2026-05-13T07:13:35.0942377Z > node tools/scripts/lint-rate-limit-budgets.mjs
2026-05-13T07:13:35.0942921Z 
2026-05-13T07:13:35.1235038Z lint-rate-limit-budgets: OK (5 D-22 budgets locked)
2026-05-13T07:13:35.1328079Z 
2026-05-13T07:13:35.1328928Z === Lint: no-clipboard-rce ===
2026-05-13T07:13:35.1329746Z >>> pnpm lint:no-clipboard-rce
2026-05-13T07:13:35.4144956Z 
2026-05-13T07:13:35.4146088Z > rebno@0.0.0 lint:no-clipboard-rce /home/runner/work/rebno/rebno
2026-05-13T07:13:35.4147115Z > node tools/scripts/lint-no-clipboard-rce.mjs
2026-05-13T07:13:35.4147617Z 
2026-05-13T07:13:35.4452279Z lint-no-clipboard-rce: OK (21 file(s) clean)
2026-05-13T07:13:35.4546631Z 
2026-05-13T07:13:35.4550705Z === Lint: room-layout ===
2026-05-13T07:13:35.4551576Z >>> pnpm lint:room-layout
2026-05-13T07:13:35.7367849Z 
2026-05-13T07:13:35.7368882Z > rebno@0.0.0 lint:room-layout /home/runner/work/rebno/rebno
2026-05-13T07:13:35.7369843Z > node tools/scripts/lint-room-layout.mjs
2026-05-13T07:13:35.7370850Z 
2026-05-13T07:13:35.7703569Z lint-room-layout: OK
2026-05-13T07:13:35.7796830Z 
2026-05-13T07:13:35.7798121Z === ADR 0004 lint ===
2026-05-13T07:13:35.7798729Z >>> pnpm lint:adr:0004
2026-05-13T07:13:36.0623538Z 
2026-05-13T07:13:36.0624649Z > rebno@0.0.0 lint:adr:0004 /home/runner/work/rebno/rebno
2026-05-13T07:13:36.0625985Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0004-room-hot-reload.md --no-matrix
2026-05-13T07:13:36.0626809Z 
2026-05-13T07:13:36.0943761Z OK: ADR docs/adr/0004-room-hot-reload.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-13T07:13:36.1031247Z 
2026-05-13T07:13:36.1031996Z === Drizzle: emit-check ===
2026-05-13T07:13:36.1032787Z >>> pnpm db:emit-check
2026-05-13T07:13:36.3850633Z 
2026-05-13T07:13:36.3851608Z > rebno@0.0.0 db:emit-check /home/runner/work/rebno/rebno
2026-05-13T07:13:36.3854403Z > pnpm -C packages/db exec drizzle-kit generate && node -e "require('fs').copyFileSync('packages/db/migrations/0001_baseline.sql','docs/extracted-server/0001_baseline.sql')" && git diff --exit-code packages/db/migrations/0001_baseline.sql docs/extracted-server/0001_baseline.sql
2026-05-13T07:13:36.3856301Z 
2026-05-13T07:13:36.8063209Z No config path provided, using default 'drizzle.config.ts'
2026-05-13T07:13:36.8065830Z Reading config file '/home/runner/work/rebno/rebno/packages/db/drizzle.config.ts'
2026-05-13T07:13:37.1985222Z 8 tables
2026-05-13T07:13:37.1985973Z accounts 8 columns 1 indexes 0 fks
2026-05-13T07:13:37.1986769Z audit_log 6 columns 0 indexes 2 fks
2026-05-13T07:13:37.1987527Z characters 9 columns 0 indexes 1 fks
2026-05-13T07:13:37.1988218Z inventory_items 4 columns 0 indexes 1 fks
2026-05-13T07:13:37.1988951Z legacy_credentials_staging 6 columns 0 indexes 0 fks
2026-05-13T07:13:37.1989759Z message_board_replies 5 columns 0 indexes 2 fks
2026-05-13T07:13:37.1990589Z message_board_topics 7 columns 0 indexes 1 fks
2026-05-13T07:13:37.1991229Z sessions 5 columns 0 indexes 1 fks
2026-05-13T07:13:37.1991653Z 
2026-05-13T07:13:37.1992373Z No schema changes, nothing to migrate 😴
2026-05-13T07:13:37.8935123Z 
2026-05-13T07:13:37.8935995Z === Drizzle: schema-sync ===
2026-05-13T07:13:37.8936715Z >>> pnpm lint:schema-sync
2026-05-13T07:13:38.1760745Z 
2026-05-13T07:13:38.1761392Z > rebno@0.0.0 lint:schema-sync /home/runner/work/rebno/rebno
2026-05-13T07:13:38.1763360Z > node -e "const a=require('fs').readFileSync('packages/db/migrations/0001_baseline.sql');const b=require('fs').readFileSync('docs/extracted-server/0001_baseline.sql');if(Buffer.compare(a,b)!==0){console.error('docs/extracted-server/0001_baseline.sql out of sync with packages/db/migrations/0001_baseline.sql');process.exit(1)}console.log('OK')"
2026-05-13T07:13:38.1764855Z 
2026-05-13T07:13:38.2019962Z OK
2026-05-13T07:13:38.2125154Z 
2026-05-13T07:13:38.2125762Z === Drizzle: source-comments ===
2026-05-13T07:13:38.2126327Z >>> pnpm lint:source-comments
2026-05-13T07:13:38.4941868Z 
2026-05-13T07:13:38.4943101Z > rebno@0.0.0 lint:source-comments /home/runner/work/rebno/rebno
2026-05-13T07:13:38.4945346Z > pnpm -C packages/db run lint:source-comments
2026-05-13T07:13:38.4945732Z 
2026-05-13T07:13:38.7976051Z 
2026-05-13T07:13:38.7977280Z > @rebno/db@0.1.0 lint:source-comments /home/runner/work/rebno/rebno/packages/db
2026-05-13T07:13:38.7978550Z > node scripts/check-source-comments.mjs
2026-05-13T07:13:38.7979124Z 
2026-05-13T07:13:38.8271699Z check-source-comments: OK (50 columns, all SOURCE-cited)
2026-05-13T07:13:38.8432780Z 
2026-05-13T07:13:38.8433558Z === Workspace: test ===
2026-05-13T07:13:38.8436020Z >>> pnpm -r test
2026-05-13T07:13:39.1319139Z Scope: 5 of 6 workspace projects
2026-05-13T07:13:39.1366928Z packages/db test$ vitest run
2026-05-13T07:13:39.1374599Z packages/game-logic test$ vitest run
2026-05-13T07:13:39.6831940Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-13T07:13:39.6847388Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-13T07:13:40.0846802Z packages/game-logic test:  [32m✓[39m test/step-bno-fidelity.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-13T07:13:40.3095286Z packages/game-logic test:  [32m✓[39m test/wall-slide.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-13T07:13:40.5385403Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-13T07:13:40.6716253Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-13T07:13:40.7729383Z packages/game-logic test:  [32m✓[39m test/walkable-edge.test.ts [2m([22m[2m1 test[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-13T07:13:40.8916353Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-13T07:13:40.9779339Z packages/game-logic test:  [32m✓[39m test/movement-constants.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-13T07:13:41.2122421Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-13T07:13:41.4156125Z packages/game-logic test:  [32m✓[39m test/navi-mask-bbox.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-13T07:13:41.6296462Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-13T07:13:41.6585172Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-13T07:13:41.6685711Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-13T07:13:41.6719647Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-13T07:13:41.6727784Z packages/db test: [2m   Start at [22m 07:13:39
2026-05-13T07:13:41.6746708Z packages/db test: [2m   Duration [22m 2.00s[2m (transform 181ms, setup 0ms, import 1.40s, tests 28ms, environment 0ms)[22m
2026-05-13T07:13:41.6970884Z packages/db test: Done
2026-05-13T07:13:41.7008110Z packages/protocol test$ vitest run
2026-05-13T07:13:41.8347594Z packages/game-logic test:  [32m✓[39m test/run-speed.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-13T07:13:42.0529784Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-13T07:13:42.0645930Z packages/game-logic test: [2m Test Files [22m [1m[32m10 passed[39m[22m[90m (10)[39m
2026-05-13T07:13:42.0685778Z packages/game-logic test: [2m      Tests [22m [1m[32m50 passed[39m[22m[90m (50)[39m
2026-05-13T07:13:42.0775721Z packages/game-logic test: [2m   Start at [22m 07:13:39
2026-05-13T07:13:42.0805902Z packages/game-logic test: [2m   Duration [22m 2.38s[2m (transform 236ms, setup 0ms, import 435ms, tests 87ms, environment 1ms)[22m
2026-05-13T07:13:42.1189621Z packages/game-logic test: Done
2026-05-13T07:13:42.1622060Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-13T07:13:42.4346174Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-13T07:13:42.5820266Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-13T07:13:42.7329500Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-13T07:13:42.8719307Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-13T07:13:42.8781131Z packages/protocol test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-13T07:13:42.8783672Z packages/protocol test: [2m      Tests [22m [1m[32m30 passed[39m[22m[90m (30)[39m
2026-05-13T07:13:42.8785659Z packages/protocol test: [2m   Start at [22m 07:13:42
2026-05-13T07:13:42.8787575Z packages/protocol test: [2m   Duration [22m 709ms[2m (transform 112ms, setup 0ms, import 214ms, tests 27ms, environment 0ms)[22m
2026-05-13T07:13:42.9046207Z packages/protocol test: Done
2026-05-13T07:13:42.9051683Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-13T07:13:42.9053461Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-13T07:13:43.4399834Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-13T07:13:43.4610513Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-13T07:13:44.6070468Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 93[2mms[22m[39m
2026-05-13T07:13:44.9586178Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 13[2mms[22m[39m
2026-05-13T07:13:45.2363116Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 22[2mms[22m[39m
2026-05-13T07:13:45.2661314Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-13T07:13:45.2706283Z apps/client test: [22m[39mroom_layout signature did not verify — rendering anyway (defense-in-depth; see 06.1-D40-SPIKE.md) mvp-lobby 000
2026-05-13T07:13:45.3499839Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 249[2mms[22m[39m
2026-05-13T07:13:45.5068374Z apps/server test: {"level":40,"time":1778656425503,"pid":3419,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-13T07:13:45.5146004Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 25[2mms[22m[39m
2026-05-13T07:13:45.5215783Z apps/server test: {"level":40,"time":1778656425506,"pid":3419,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-13T07:13:45.5245630Z apps/server test: {"level":40,"time":1778656425507,"pid":3419,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-13T07:13:46.3401093Z apps/server test: {"level":30,"time":1778656426337,"pid":3449,"hostname":"runnervmeorf1","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-13T07:13:46.3427829Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 609[2mms[22m[39m
2026-05-13T07:13:46.3451803Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 494[2mms[22m[39m
2026-05-13T07:13:46.3546480Z apps/client test:  [32m✓[39m src/__test__/sprite-state-machine.test.ts [2m([22m[2m29 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-13T07:13:47.2186764Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-13T07:13:47.2197274Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-7JVpYF/rebno.db
2026-05-13T07:13:47.2198691Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-13T07:13:47.2201245Z apps/server test: [run-migrations] OK
2026-05-13T07:13:47.2301998Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-13T07:13:47.2315140Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-aLhvK3/rebno.db
2026-05-13T07:13:47.2316909Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-13T07:13:47.2320326Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-13T07:13:47.2322534Z apps/server test: [run-migrations] OK
2026-05-13T07:13:47.2369072Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-13T07:13:47.2385449Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-pMpbwf/rebno.db
2026-05-13T07:13:47.2415514Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-13T07:13:47.2446247Z apps/server test: [run-migrations] OK
2026-05-13T07:13:47.2470845Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-13T07:13:47.2475483Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-pMpbwf/rebno.db
2026-05-13T07:13:47.2476973Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-13T07:13:47.2477932Z apps/server test: [run-migrations] OK
2026-05-13T07:13:47.2479285Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 48[2mms[22m[39m
2026-05-13T07:13:47.4199272Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 16[2mms[22m[39m
2026-05-13T07:13:47.5231613Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-13T07:13:47.7628357Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 18[2mms[22m[39m
2026-05-13T07:13:47.9987307Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 17[2mms[22m[39m
2026-05-13T07:13:48.2133546Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-13T07:13:48.5426257Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 30[2mms[22m[39m
2026-05-13T07:13:49.0242863Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-13T07:13:49.0260530Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ⌘ multiple files { path: ['.env.local', '.env'] }
2026-05-13T07:13:49.0271069Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-13T07:13:49.6135926Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 51[2mms[22m[39m
2026-05-13T07:13:49.7890515Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-13T07:13:49.7996498Z apps/server test: [2m Test Files [22m [1m[32m11 passed[39m[22m[90m (11)[39m
2026-05-13T07:13:49.8046125Z apps/server test: [2m      Tests [22m [1m[32m61 passed[39m[22m[90m (61)[39m
2026-05-13T07:13:49.8054676Z apps/server test: [2m   Start at [22m 07:13:43
2026-05-13T07:13:49.8077617Z apps/server test: [2m   Duration [22m 6.34s[2m (transform 456ms, setup 0ms, import 3.31s, tests 878ms, environment 1ms)[22m
2026-05-13T07:13:49.8310546Z apps/server test: Done
2026-05-13T07:13:50.2838662Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m12 tests[22m[2m)[22m[32m 14[2mms[22m[39m
2026-05-13T07:13:50.9193585Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 64[2mms[22m[39m
2026-05-13T07:13:51.5856030Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 84[2mms[22m[39m
2026-05-13T07:13:52.2070361Z apps/client test:  [32m✓[39m src/__test__/nameplate-color.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 30[2mms[22m[39m
2026-05-13T07:13:52.8586921Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 67[2mms[22m[39m
2026-05-13T07:13:53.4986116Z apps/client test:  [32m✓[39m src/__test__/esc-menu.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 70[2mms[22m[39m
2026-05-13T07:13:54.0849752Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-13T07:13:54.7480420Z apps/client test:  [32m✓[39m src/__test__/background-renderer.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 75[2mms[22m[39m
2026-05-13T07:13:55.3459077Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-13T07:13:55.9270133Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-13T07:13:56.4992810Z apps/client test:  [32m✓[39m src/__test__/sprite-state-rate.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-13T07:13:57.0866724Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-13T07:13:57.6786058Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher-shift.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-13T07:13:58.2907151Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-13T07:13:58.8751798Z apps/client test:  [32m✓[39m src/__test__/room-collision-bottom-edge.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-13T07:13:59.4492762Z apps/client test:  [32m✓[39m src/__test__/depth-set.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 3[2mms[22m[39m
2026-05-13T07:14:00.0466284Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-13T07:14:00.6349570Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-13T07:14:01.2182394Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-13T07:14:01.2412025Z apps/client test: [2m Test Files [22m [1m[32m24 passed[39m[22m[90m (24)[39m
2026-05-13T07:14:01.2413825Z apps/client test: [2m      Tests [22m [1m[32m183 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (187)[39m
2026-05-13T07:14:01.2416303Z apps/client test: [2m   Start at [22m 07:13:43
2026-05-13T07:14:01.2417883Z apps/client test: [2m   Duration [22m 17.77s[2m (transform 803ms, setup 56ms, collect 1.21s, tests 821ms, environment 10.08s, prepare 1.98s)[22m
2026-05-13T07:14:01.3576679Z apps/client test: Done
2026-05-13T07:14:01.3647789Z 
2026-05-13T07:14:01.3648870Z verify-phase-4: OK (12 steps green)
